package tokens

import (
	"fmt"
	"github.com/golang-jwt/jwt/v5"
	"os"
	"time"
)

// MyClaims 自定义 Claims 结构体
type MyClaims struct {
	Name  string `json:"name"`
	Phone string `json:"phone"`
	jwt.RegisteredClaims
}

var SecretKey string // 密钥

// init 函数会在包被导入时自动执行
func init() {
	SecretKey = os.Getenv("SECRET_KEY")
	if SecretKey == "" {
		// 如果环境变量未设置，可以提供一个默认值或报错
		SecretKey = "default-secret-key"
	}
}

// GenerateToken 生成 JWT Token
func GenerateToken(name string, phone string) (string, error) {
	// 定义 Token 的过期时间
	expirationTime := time.Now().Add(24 * 3 * time.Hour)

	// 创建 Claims
	claims := MyClaims{
		Name:  name,
		Phone: phone,
		RegisteredClaims: jwt.RegisteredClaims{
			ExpiresAt: jwt.NewNumericDate(expirationTime),
			Issuer:    "your-app",
		},
	}
	// 创建 JWT Token
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	// 签名并生成 Token 字符串
	tokenString, err := token.SignedString([]byte(SecretKey))
	if err != nil {
		return "", err
	}
	return tokenString, nil
}

// VerifyToken 验证Token并解析Claims
func VerifyToken(userToken string) (MyClaims, error) {
	token, err := jwt.ParseWithClaims(userToken, &MyClaims{}, func(token *jwt.Token) (interface{}, error) {
		return []byte(SecretKey), nil
	})
	if err != nil {
		return MyClaims{}, err
	}
	claims, ok := token.Claims.(*MyClaims)
	if !ok {
		return MyClaims{}, fmt.Errorf("invalid token claims")
	}
	return *claims, nil
}
